์ต์์ WebGL ๋ ๋๋ง ์ฑ๋ฅ์ ๊ฒฝํํ์ธ์! ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ธ ๋ ๋๋ง์ ์ํ ์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋ ์ต์ ํ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ธฐ์ ์ ์ดํด๋ณด์ธ์.
WebGL ๋ ๋ ๋ฒ๋ค ์ฑ๋ฅ: ์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋ ์ต์ ํ
WebGL์ ์น ๋ธ๋ผ์ฐ์ ์์ ๊ณ ์ฑ๋ฅ 2D ๋ฐ 3D ๊ทธ๋ํฝ์ ์ ๊ณตํ๋ ํ์ค์ด ๋์์ต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ ์ ๊ตํด์ง์ ๋ฐ๋ผ, ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด WebGL ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. WebGL ์ฑ๋ฅ์ ํต์ฌ์ ์ธ ์ธก๋ฉด์ GPU๋ก ์ ์ก๋๋ ์ผ๋ จ์ ๋ช ๋ น์ด์ธ ์ปค๋งจ๋ ๋ฒํผ๊ฐ ์ฒ๋ฆฌ๋๋ ์๋์ ๋๋ค. ์ด ๊ธ์์๋ ์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ๋ค์ ์ดํด๋ณด๊ณ ์ต์ ํ๋ฅผ ์ํ ์ค์ฉ์ ์ธ ๊ธฐ์ ๋ค์ ์ ๊ณตํฉ๋๋ค.
WebGL ๋ ๋๋ง ํ์ดํ๋ผ์ธ ์ดํดํ๊ธฐ
์ปค๋งจ๋ ๋ฒํผ ์ต์ ํ์ ๋ํด ์์๋ณด๊ธฐ ์ ์, WebGL ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ํ์ดํ๋ผ์ธ์ ๋ฐ์ดํฐ๊ฐ ํ๋ฉด์ ํ์๋๋ ์ต์ข ์ด๋ฏธ์ง๋ก ๋ณํ๋๊ธฐ๊น์ง ๊ฑฐ์น๋ ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ๋ํ๋ ๋๋ค. ํ์ดํ๋ผ์ธ์ ์ฃผ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ์ ์ฒ๋ฆฌ(Vertex Processing): ์ด ๋จ๊ณ๋ 3D ๋ชจ๋ธ์ ์ ์ ์ ์ฒ๋ฆฌํ์ฌ ๊ฐ์ฒด ๊ณต๊ฐ(object space)์์ ํ๋ฉด ๊ณต๊ฐ(screen space)์ผ๋ก ๋ณํํฉ๋๋ค. ์ ์ ์ ฐ์ด๋(Vertex shaders)๊ฐ ์ด ๋จ๊ณ๋ฅผ ๋ด๋นํฉ๋๋ค.
- ๋์คํฐํ(Rasterization): ์ด ๋จ๊ณ๋ ๋ณํ๋ ์ ์ ์ ๋ ๋๋ง๋ ๊ฐ๋ณ ํฝ์ ์ธ ํ๋๊ทธ๋จผํธ(fragments)๋ก ๋ณํํฉ๋๋ค.
- ํ๋๊ทธ๋จผํธ ์ฒ๋ฆฌ(Fragment Processing): ์ด ๋จ๊ณ๋ ํ๋๊ทธ๋จผํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ต์ข ์์ ๋ฐ ๊ธฐํ ์์ฑ์ ๊ฒฐ์ ํฉ๋๋ค. ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋(Fragment shaders)๊ฐ ์ด ๋จ๊ณ๋ฅผ ๋ด๋นํฉ๋๋ค.
- ์ถ๋ ฅ ๋ณํฉ(Output Merging): ์ด ๋จ๊ณ๋ ํ๋๊ทธ๋จผํธ๋ฅผ ๊ธฐ์กด ํ๋ ์ ๋ฒํผ์ ๊ฒฐํฉํ๊ณ ๋ธ๋ ๋ฉ ๋ฐ ๊ธฐํ ํจ๊ณผ๋ฅผ ์ ์ฉํ์ฌ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
CPU๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ณ GPU์ ๋ช ๋ น์ ๋ด๋ฆฝ๋๋ค. ์ปค๋งจ๋ ๋ฒํผ๋ ์ด๋ฌํ ๋ช ๋ น๋ค์ ์์ฐจ์ ์ธ ๋ชฉ๋ก์ ๋๋ค. GPU๊ฐ ์ด ๋ฒํผ๋ฅผ ๋ ๋นจ๋ฆฌ ์ฒ๋ฆฌํ ์๋ก ์ฅ๋ฉด์ ๋ ๋นจ๋ฆฌ ๋ ๋๋งํ ์ ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ์ดํดํ๋ฉด ๊ฐ๋ฐ์๋ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํน์ ๋จ๊ณ๋ฅผ ์ต์ ํํ์ฌ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ปค๋งจ๋ ๋ฒํผ์ ์ญํ
์ปค๋งจ๋ ๋ฒํผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(๋๋ ์น์ด์ ๋ธ๋ฆฌ)์ GPU ์ฌ์ด์ ๋ค๋ฆฌ ์ญํ ์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ์ง์นจ์ด ํฌํจ๋ฉ๋๋ค:
- ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์ค์
- ํ ์ค์ฒ ๋ฐ์ธ๋ฉ
- ์ ๋ํผ(์ ฐ์ด๋ ๋ณ์) ์ค์
- ์ ์ ๋ฒํผ ๋ฐ์ธ๋ฉ
- ๋๋ก์ฐ ์ฝ(draw calls) ๋ฐ์
์ด๋ฌํ ๊ฐ ๋ช ๋ น์ด์๋ ๊ด๋ จ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค. ๋ ๋ง์ ๋ช ๋ น์ ๋ด๋ฆฌ๊ณ ๊ทธ ๋ช ๋ น์ด ๋ ๋ณต์กํ ์๋ก GPU๊ฐ ๋ฒํผ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ๋ฐ๋ผ์ ์ปค๋งจ๋ ๋ฒํผ์ ํฌ๊ธฐ์ ๋ณต์ก์ฑ์ ์ต์ํํ๋ ๊ฒ์ด ์ค์ํ ์ต์ ํ ์ ๋ต์ ๋๋ค.
์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ
GPU๊ฐ ์ปค๋งจ๋ ๋ฒํผ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋์ ์ํฅ์ ๋ฏธ์น๋ ๋ช ๊ฐ์ง ์์ธ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๋๋ก์ฐ ์ฝ์ ์: ๋๋ก์ฐ ์ฝ์ ๊ฐ์ฅ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋๋ค. ๊ฐ ๋๋ก์ฐ ์ฝ์ GPU์ ํน์ ํ๋ฆฌ๋ฏธํฐ๋ธ(์: ์ผ๊ฐํ)๋ฅผ ๋ ๋๋งํ๋๋ก ์ง์ํฉ๋๋ค. ๋๋ก์ฐ ์ฝ์ ์๋ฅผ ์ค์ด๋ ๊ฒ์ด ์ข ์ข ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋จ์ผ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ํ ๋ณ๊ฒฝ: ๋ค๋ฅธ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ, ํ ์ค์ฒ ๋๋ ๊ธฐํ ๋ ๋๋ง ์ํ ๊ฐ์ ์ ํํ๋ ค๋ฉด GPU๊ฐ ์ค์ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ํ ๋ณ๊ฒฝ์ ์ต์ํํ๋ฉด ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
- ์ ๋ํผ ์ ๋ฐ์ดํธ: ์ ๋ํผ, ํนํ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ ๋ํผ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก: CPU์์ GPU๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ(์: ์ ์ ๋ฒํผ ์ ๋ฐ์ดํธ)์ ๋น๊ต์ ๋๋ฆฐ ์์ ์ ๋๋ค. ๋ฐ์ดํฐ ์ ์ก์ ์ต์ํํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- GPU ์ํคํ ์ฒ: GPU๋ง๋ค ์ํคํ ์ฒ์ ์ฑ๋ฅ ํน์ฑ์ด ๋ค๋ฆ ๋๋ค. WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋์ GPU์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
- ๋๋ผ์ด๋ฒ ์ค๋ฒํค๋: ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ๋ WebGL ๋ช ๋ น์ GPU๋ณ ๋ช ๋ น์ผ๋ก ๋ณํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋๋ผ์ด๋ฒ ์ค๋ฒํค๋๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฉฐ, ๋๋ผ์ด๋ฒ๋ง๋ค ์ต์ ํ ์์ค์ด ๋ค๋ฅผ ์ ์์ต๋๋ค.
์ต์ ํ ๊ธฐ๋ฒ
๋ค์์ WebGL์์ ์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ธฐ๋ฒ์ ๋๋ค:
1. ๋ฐฐ์นญ(Batching)
๋ฐฐ์นญ์ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๊ฒฐํฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๋๋ก์ฐ ์ฝ์ ์์ ๊ด๋ จ๋ ์ํ ๋ณ๊ฒฝ์ ์ค์ฌ์ค๋๋ค.
์์: 100๊ฐ์ ๊ฐ๋ณ ํ๋ธ๋ฅผ 100๋ฒ์ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํ๋ ๋์ , ๋ชจ๋ ํ๋ธ ์ ์ ์ ๋จ์ผ ์ ์ ๋ฒํผ๋ก ๊ฒฐํฉํ๊ณ ํ ๋ฒ์ ๋๋ก์ฐ ์ฝ๋ก ๋ ๋๋งํฉ๋๋ค.
๋ฐฐ์นญ์๋ ๋ค์ํ ์ ๋ต์ด ์์ต๋๋ค:
- ์ ์ ๋ฐฐ์นญ(Static Batching): ์์ง์ด๊ฑฐ๋ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ์ ์ ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
- ๋์ ๋ฐฐ์นญ(Dynamic Batching): ๋์ผํ ๋จธํฐ๋ฆฌ์ผ์ ๊ณต์ ํ๋ ์์ง์ด๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ ๊ฐ์ฒด๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
์ค์ฉ ์์: ๋น์ทํ ๋๋ฌด ์ฌ๋ฌ ๊ทธ๋ฃจ๊ฐ ์๋ ์ฅ๋ฉด์ ์๊ฐํด ๋ณด์ธ์. ๊ฐ ๋๋ฌด๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ๋์ , ๋ชจ๋ ๋๋ฌด์ ๊ฒฐํฉ๋ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ํฌํจํ๋ ๋จ์ผ ์ ์ ๋ฒํผ๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋จ์ผ ๋๋ก์ฐ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋๋ฌด๋ฅผ ํ ๋ฒ์ ๋ ๋๋งํฉ๋๋ค. ์ ๋ํผ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ๊ฐ ๋๋ฌด๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐฐ์นํ ์ ์์ต๋๋ค.
2. ์ธ์คํด์ฑ(Instancing)
์ธ์คํด์ฑ์ ์ฌ์ฉํ๋ฉด ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ๋์ผํ ๊ฐ์ฒด์ ์ฌ๋ฌ ๋ณต์ฌ๋ณธ์ ๋ค๋ฅธ ๋ณํ์ผ๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ ๋ง์ ์์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
์์: ํ๋ฐญ, ์ ๋ผ ๋๋ ๊ตฐ์ค์ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
์ธ์คํด์ฑ์ ์ข ์ข ๋ณํ ํ๋ ฌ, ์์ ๋๋ ๊ธฐํ ์์ฑ๊ณผ ๊ฐ์ ์ธ์คํด์ค๋ณ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์ ์ ์์ฑ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ์ด๋ฌํ ์์ฑ์ ๊ฐ ์ธ์คํด์ค์ ๋ชจ์์ ์์ ํ๊ธฐ ์ํด ์ ์ ์ ฐ์ด๋์์ ์ ๊ทผํฉ๋๋ค.
์ค์ฉ ์์: ๋ ์ ํฉ์ด์ ธ ์๋ ๋ง์ ์์ ๋์ ์ ๋ ๋๋งํ๋ ค๋ฉด ๋จ์ผ ๋์ ๋ชจ๋ธ์ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ธ์คํด์ฑ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์์น์ ๋ฐฉํฅ์ผ๋ก ๋์ ์ ์ฌ๋ฌ ๋ณต์ฌ๋ณธ์ ๋ ๋๋งํฉ๋๋ค. ๊ฐ ์ธ์คํด์ค๋ ๊ณ ์ ํ ๋ณํ ํ๋ ฌ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ ์์ฑ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
3. ์ํ ๋ณ๊ฒฝ ์ค์ด๊ธฐ
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ ํํ๊ฑฐ๋ ๋ค๋ฅธ ํ ์ค์ฒ๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ํ ๋ณ๊ฒฝ์ ์๋นํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ค์์ ํตํด ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ต์ํํ์ธ์:
- ๋จธํฐ๋ฆฌ์ผ๋ณ๋ก ๊ฐ์ฒด ์ ๋ ฌ: ๋์ผํ ๋จธํฐ๋ฆฌ์ผ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ํจ๊ป ๋ ๋๋งํ์ฌ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๋ฐ ํ ์ค์ฒ ์ ํ์ ์ต์ํํฉ๋๋ค.
- ํ ์ค์ฒ ์ํ๋ผ์ค ์ฌ์ฉ: ์ฌ๋ฌ ํ ์ค์ฒ๋ฅผ ๋จ์ผ ํ ์ค์ฒ ์ํ๋ผ์ค๋ก ๊ฒฐํฉํ์ฌ ํ ์ค์ฒ ๋ฐ์ธ๋ฉ ์์ ์๋ฅผ ์ค์ ๋๋ค.
- ์ ๋ํผ ๋ฒํผ ์ฌ์ฉ: ์ ๋ํผ ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ จ ์ ๋ํผ์ ํจ๊ป ๊ทธ๋ฃนํํ๊ณ ๋จ์ผ ๋ช ๋ น์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
์ค์ฉ ์์: ๋ค๋ฅธ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด ๋ชจ๋ ํ ์ค์ฒ๋ฅผ ๋จ์ผ ์ด๋ฏธ์ง๋ก ๊ฒฐํฉํ๋ ํ ์ค์ฒ ์ํ๋ผ์ค๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ UV ์ขํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ฐ์ฒด์ ์ ํฉํ ํ ์ค์ฒ ์์ญ์ ์ ํํฉ๋๋ค.
4. ์ ฐ์ด๋ ์ต์ ํ
์ ฐ์ด๋ ์ฝ๋๋ฅผ ์ต์ ํํ๋ฉด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ณ์ฐ ์ต์ํ: ์ผ๊ฐ ํจ์, ์ ๊ณฑ๊ทผ, ์ง์ ํจ์์ ๊ฐ์ ์ ฐ์ด๋ ๋ด์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ์๋ฅผ ์ค์ ๋๋ค.
- ์ ์ ๋ฐ๋ ๋ฐ์ดํฐ ํ์ ์ฌ์ฉ: ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ ์ ๋ฐ๋ ๋ฐ์ดํฐ ํ์ (์: `mediump` ๋๋ `lowp`)์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋ถ๊ธฐ ํผํ๊ธฐ: ๋ถ๊ธฐ(์: `if` ๋ฌธ)๋ ์ผ๋ถ GPU์์ ๋๋ฆด ์ ์์ต๋๋ค. ๋ธ๋ ๋ฉ์ด๋ ๋ฃฉ์ ํ ์ด๋ธ๊ณผ ๊ฐ์ ๋์ฒด ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ถ๊ธฐ๋ฅผ ํผํ๋๋ก ๋ ธ๋ ฅํ์ธ์.
- ๋ฃจํ ํ๊ธฐ(Unroll Loops): ๋ฃจํ๋ฅผ ํ๋ฉด ๋ฃจํ ์ค๋ฒํค๋๋ฅผ ์ค์ฌ ๋๋๋ก ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์ต๋๋ค.
์ค์ฉ ์์: ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์์ ๊ฐ์ ์ ๊ณฑ๊ทผ์ ๊ณ์ฐํ๋ ๋์ , ์ ๊ณฑ๊ทผ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ ๋ฃฉ์ ํ ์ด๋ธ์ ์ ์ฅํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ๋๋ง ์ค์ ๋ฃฉ์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ ๊ณฑ๊ทผ์ ๊ทผ์ฌํํฉ๋๋ค.
5. ๋ฐ์ดํฐ ์ ์ก ์ต์ํ
CPU์์ GPU๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ ๋น๊ต์ ๋๋ฆฐ ์์ ์ ๋๋ค. ๋ค์์ ํตํด ๋ฐ์ดํฐ ์ ์ก์ ์ต์ํํ์ธ์:
- ์ ์ ๋ฒํผ ๊ฐ์ฒด(VBOs) ์ฌ์ฉ: ์ ์ ๋ฐ์ดํฐ๋ฅผ VBO์ ์ ์ฅํ์ฌ ๋งค ํ๋ ์๋ง๋ค ์ ์กํ๋ ๊ฒ์ ํผํฉ๋๋ค.
- ์ธ๋ฑ์ค ๋ฒํผ ๊ฐ์ฒด(IBOs) ์ฌ์ฉ: IBO๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ์ ์ฌ์ฌ์ฉํ๊ณ ์ ์กํด์ผ ํ๋ ๋ฐ์ดํฐ ์์ ์ค์ ๋๋ค.
- ๋ฐ์ดํฐ ํ ์ค์ฒ ์ฌ์ฉ: ๋ฃฉ์ ํ ์ด๋ธ์ด๋ ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ๊ฐ๊ณผ ๊ฐ์ด ์ ฐ์ด๋์์ ์ ๊ทผํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋์ ๋ฒํผ ์ ๋ฐ์ดํธ ์ต์ํ: ๋ฒํผ๋ฅผ ์์ฃผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๋๋ก ๋ ธ๋ ฅํ์ธ์.
์ค์ฉ ์์: ๋งค ํ๋ ์๋ง๋ค ๋ง์ ์์ ๊ฐ์ฒด ์์น๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ, GPU์์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๊ธฐ ์ํด ํธ๋์คํผ ํผ๋๋ฐฑ(transform feedback)์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ CPU๋ก ๋ค์ ์ ์กํ๋ค๊ฐ ๋ค์ GPU๋ก ์ ์กํ๋ ๊ฒ์ ํผํ ์ ์์ต๋๋ค.
6. ์น์ด์ ๋ธ๋ฆฌ(WebAssembly) ํ์ฉ
์น์ด์ ๋ธ๋ฆฌ(WASM)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๊ฑฐ์ ๋ค์ดํฐ๋ธ ์๋๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์ค์ํ ๋ถ๋ถ์ ์น์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์ ํนํ ํจ๊ณผ์ ์ ๋๋ค.
์์: ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ , ๊ฒฝ๋ก ์ฐพ๊ธฐ ๋๋ ๊ธฐํ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ๊ธฐ ์ํด ์น์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์น์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋งจ๋ ๋ฒํผ ์์ฒด๋ฅผ ์์ฑํจ์ผ๋ก์จ ์๋ฐ์คํฌ๋ฆฝํธ ํด์์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์น์ด์ ๋ธ๋ฆฌ/์๋ฐ์คํฌ๋ฆฝํธ ๊ฒฝ๊ณ์ ๋น์ฉ์ด ์ด์ ์ ์์ํ์ง ์๋๋ก ์ ์คํ๊ฒ ํ๋กํ์ผ๋งํด์ผ ํฉ๋๋ค.
7. ์คํด๋ฃจ์ ์ปฌ๋ง(Occlusion Culling)
์คํด๋ฃจ์ ์ปฌ๋ง์ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ํด ๊ฐ๋ ค์ ธ ๋ณด์ด์ง ์๋ ๊ฐ์ฒด์ ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ํนํ ๋ณต์กํ ์ฅ๋ฉด์์ ๋๋ก์ฐ ์ฝ ์๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์: ๋์ ์ฅ๋ฉด์์ ์คํด๋ฃจ์ ์ปฌ๋ง์ ๋ค๋ฅธ ๊ฑด๋ฌผ ๋ค์ ๊ฐ๋ ค์ง ๊ฑด๋ฌผ์ ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์คํด๋ฃจ์ ์ปฌ๋ง์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค:
- ํ๋ฌ์คํ ์ปฌ๋ง(Frustum Culling): ์นด๋ฉ๋ผ์ ๋ทฐ ํ๋ฌ์คํ ์ธ๋ถ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฒ๋ฆฝ๋๋ค.
- ํ๋ฉด ์ปฌ๋ง(Backface Culling): ๋ท๋ฉด์ ํฅํ๋ ์ผ๊ฐํ์ ๋ฒ๋ฆฝ๋๋ค.
- ๊ณ์ธต์ Z-๋ฒํผ๋ง(Hierarchical Z-Buffering, HZB): ๊น์ด ๋ฒํผ์ ๊ณ์ธต์ ํํ์ ์ฌ์ฉํ์ฌ ์ด๋ค ๊ฐ์ฒด๊ฐ ๊ฐ๋ ค์ก๋์ง ๋น ๋ฅด๊ฒ ๊ฒฐ์ ํฉ๋๋ค.
8. ๋ํ ์ผ ์์ค(Level of Detail, LOD)
๋ํ ์ผ ์์ค(LOD)์ ์นด๋ฉ๋ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๊ฐ์ฒด์ ๋ํด ๋ค๋ฅธ ์์ค์ ๋ํ ์ผ์ ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค. ์นด๋ฉ๋ผ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ฐ์ฒด๋ ๋ ๋ฎ์ ์์ค์ ๋ํ ์ผ๋ก ๋ ๋๋ง๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ผ๊ฐํ ์๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์์: ๋๋ฌด๊ฐ ์นด๋ฉ๋ผ์ ๊ฐ๊น์ด ์์ ๋๋ ๋์ ์์ค์ ๋ํ ์ผ๋ก ๋ ๋๋งํ๊ณ , ๋ฉ๋ฆฌ ์์ ๋๋ ๋ฎ์ ์์ค์ ๋ํ ์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
9. ํ์ฅ ๊ธฐ๋ฅ ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ธฐ
WebGL์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ ์ ์๋ ๋ค์ํ ํ์ฅ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํธํ์ฑ ๋ฌธ์ ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค. ํ์ฅ ๊ธฐ๋ฅ์ ํ๋ช ํ๊ฒ, ๊ทธ๋ฆฌ๊ณ ํ์ํ ๋๋ง ์ฌ์ฉํ์ธ์.
์์: `ANGLE_instanced_arrays` ํ์ฅ์ ์ธ์คํด์ฑ์ ๋งค์ฐ ์ค์ํ์ง๋ง, ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
10. ํ๋กํ์ผ๋ง ๋ฐ ๋๋ฒ๊น
ํ๋กํ์ผ๋ง๊ณผ ๋๋ฒ๊น ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome DevTools, Firefox Developer Tools)๋ฅผ ์ฌ์ฉํ์ฌ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ ์์ญ์ ์๋ณํ์ธ์.
Spector.js๋ WebGL Insight์ ๊ฐ์ ๋๊ตฌ๋ WebGL API ํธ์ถ, ์ ฐ์ด๋ ์ฑ๋ฅ ๋ฐ ๊ธฐํ ๋ฉํธ๋ฆญ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ตฌ์ฒด์ ์ธ ์์ ๋ฐ ์ฌ๋ก ์ฐ๊ตฌ
์ด๋ฌํ ์ต์ ํ ๊ธฐ์ ์ด ์ค์ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ํํฐํด ์์คํ ์ต์ ํ
ํํฐํด ์์คํ ์ ์ฐ๊ธฐ, ๋ถ, ํญ๋ฐ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ง์ ์์ ํํฐํด์ ๋ ๋๋งํ๋ ๊ฒ์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๋ค์์ ํํฐํด ์์คํ ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค:
- ์ธ์คํด์ฑ: ์ธ์คํด์ฑ์ ์ฌ์ฉํ์ฌ ๋จ์ผ ๋๋ก์ฐ ์ฝ๋ก ์ฌ๋ฌ ํํฐํด์ ๋ ๋๋งํฉ๋๋ค.
- ์ ์ ์์ฑ: ์์น, ์๋, ์์๊ณผ ๊ฐ์ ํํฐํด๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์์ฑ์ ์ ์ฅํฉ๋๋ค.
- ์ ฐ์ด๋ ์ต์ ํ: ๊ณ์ฐ์ ์ต์ํํ๋๋ก ํํฐํด ์ ฐ์ด๋๋ฅผ ์ต์ ํํฉ๋๋ค.
- ๋ฐ์ดํฐ ํ ์ค์ฒ: ์ ฐ์ด๋์์ ์ ๊ทผํด์ผ ํ๋ ํํฐํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ฐ์ดํฐ ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ 2: ์งํ ๋ ๋๋ง ์์ง ์ต์ ํ
์งํ ๋ ๋๋ง์ ๊ด๋ จ๋ ์ผ๊ฐํ์ ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ค์์ ์งํ ๋ ๋๋ง ์์ง์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค:
- ๋ํ ์ผ ์์ค(LOD): LOD๋ฅผ ์ฌ์ฉํ์ฌ ์นด๋ฉ๋ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ํ ์ผ ์์ค์ผ๋ก ์งํ์ ๋ ๋๋งํฉ๋๋ค.
- ํ๋ฌ์คํ ์ปฌ๋ง: ์นด๋ฉ๋ผ์ ๋ทฐ ํ๋ฌ์คํ ์ธ๋ถ์ ์๋ ์งํ ์ฒญํฌ๋ฅผ ์ปฌ๋งํฉ๋๋ค.
- ํ ์ค์ฒ ์ํ๋ผ์ค: ํ ์ค์ฒ ์ํ๋ผ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ค์ฒ ๋ฐ์ธ๋ฉ ์์ ์๋ฅผ ์ค์ ๋๋ค.
- ๋ ธ๋ฉ ๋งคํ: ๋ ธ๋ฉ ๋งคํ์ ์ฌ์ฉํ์ฌ ์ผ๊ฐํ ์๋ฅผ ๋๋ฆฌ์ง ์๊ณ ์งํ์ ๋ํ ์ผ์ ์ถ๊ฐํฉ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ: ๋ชจ๋ฐ์ผ ๊ฒ์
์๋๋ก์ด๋์ iOS ๋ชจ๋๋ฅผ ์ํด ๊ฐ๋ฐ๋ ํ ๋ชจ๋ฐ์ผ ๊ฒ์์ ๋ค์ํ ์ฅ์น์์ ์ํํ๊ฒ ์คํ๋์ด์ผ ํ์ต๋๋ค. ์ด๊ธฐ์ ์ด ๊ฒ์์ ํนํ ์ ์ฌ์ ์ฅ์น์์ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. ๋ค์ ์ต์ ํ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์์ต๋๋ค:
- ๋ฐฐ์นญ: ๋๋ก์ฐ ์ฝ ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ ์ ๋ฐ ๋์ ๋ฐฐ์นญ์ ๊ตฌํํ์ต๋๋ค.
- ํ ์ค์ฒ ์์ถ: ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ์ค์ด๊ธฐ ์ํด ์์ถ๋ ํ ์ค์ฒ(์: ETC1, PVRTC)๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ์ ฐ์ด๋ ์ต์ ํ: ๊ณ์ฐ๊ณผ ๋ถ๊ธฐ๋ฅผ ์ต์ํํ๋๋ก ์ ฐ์ด๋ ์ฝ๋๋ฅผ ์ต์ ํํ์ต๋๋ค.
- LOD: ๋ณต์กํ ๋ชจ๋ธ์ ๋ํด LOD๋ฅผ ๊ตฌํํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ, ๊ฒ์์ ์ ์ฌ์ ํด๋ํฐ์ ํฌํจํ ๋ ๋์ ๋ฒ์์ ์ฅ์น์์ ์ํํ๊ฒ ์คํ๋์๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
๋ฏธ๋ ๋ํฅ
WebGL ๋ ๋๋ง์ ํ๊ฒฝ์ ๋์์์ด ์งํํ๊ณ ์์ต๋๋ค. ์ฃผ๋ชฉํด์ผ ํ ๋ช ๊ฐ์ง ๋ฏธ๋ ๋ํฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- WebGL 2.0: WebGL 2.0์ ํธ๋์คํผ ํผ๋๋ฐฑ, ๋ฉํฐ์ํ๋ง, ์คํด๋ฃจ์ ์ฟผ๋ฆฌ์ ๊ฐ์ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.
- WebGPU: WebGPU๋ WebGL๋ณด๋ค ๋ ํจ์จ์ ์ด๊ณ ์ ์ฐํ๊ฒ ์ค๊ณ๋ ์๋ก์ด ๊ทธ๋ํฝ API์ ๋๋ค.
- ๋ ์ด ํธ๋ ์ด์ฑ: ํ๋์จ์ด์ ์ํํธ์จ์ด์ ๋ฐ์ ๋๋ถ์ ๋ธ๋ผ์ฐ์ ์์์ ์ค์๊ฐ ๋ ์ด ํธ๋ ์ด์ฑ์ด ์ ์ ๋ ์คํ ๊ฐ๋ฅํด์ง๊ณ ์์ต๋๋ค.
๊ฒฐ๋ก
WebGL ๋ ๋ ๋ฒ๋ค ์ฑ๋ฅ, ํนํ ์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ์ข์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ปค๋งจ๋ ๋ฒํผ ์ฒ๋ฆฌ ์๋์ ์ํฅ์ ๋ฏธ์น๋ ์์ธ์ ์ดํดํ๊ณ ์ด ๊ธ์์ ๋ ผ์๋ ๊ธฐ์ ์ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
WebGL์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ต์ ๊ธฐ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ์์ฉํจ์ผ๋ก์จ WebGL์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋๋๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ๊ทธ๋ํฝ ๊ฒฝํ์ ์ ์ฌํ ์ ์์ต๋๋ค.